package com.hsc.offer;

import com.sun.javaws.Main;

/**
 * @author
 * @date 2025-06-18
 * @Description 11.输入一个整数，输出该数二进制表示中1的个数。其中负数用补码表示。
 */
public class OfferTest6 {
    public static void main(String[] args) {
        // 5 的二级制 表示
        // 101
        // -5 的补码 二进制中补码形式表示负数。 （二进制中负数的补码计算方法是在正数的的二进制反码基础上+1)
        // 000000000 00000000 00000000 00000101
        // 反码 ： 11111111 11111111 11111111 1111 1010
        // 补码：11111111 11111111 11111111 1111 1011
        System.out.println("NumberOf1(5) = " + NumberOf2(-5));
    }


    /**
     * 方法一
     * @param n
     * @return
     */
    public static int NumberOf1(int n) {
        // 直接调用api
        char[] charArray = Integer.toBinaryString(n).toCharArray();
        System.out.println(charArray);
        // 计算 1的个数
        int count = 0;
        int test = '0';
        System.out.println(test);
        for (int i = 0; i < charArray.length; i++) {
            // '0' 的 ASCII 码是 48，'1' 的 ASCII 码是 49。
            // 如果 charArray[i] 中的元素为 1的话 charArray[i]=> 49
            // charArray[i] - '0' = > 49-48=1 这就是代表得到了一个 1的次数 将这样的次数累加
            count = count + charArray[i] - '0';  // 累加 1 的个数
        }
        return count;
    }

    /**
     * 方法二
     * @param n
     * @return
     */
    public static int NumberOf2(int n) {
        // 直接调用api 直接进行统计
        return Integer.bitCount(n);

    }




}
